home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-02
/
heaptrk.zip
/
DATES.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-01-04
|
6KB
|
348 lines
Unit Dates;
Interface
Uses crt,dos;
Type
DateSTr = String[12];
MonthStrg = string[10];
Function Date : DateStr;
FUNCTION DATE_TO_DOY(DT : DATESTR) : INTEGER;
FUNCTION DOY_TO_DATE (DY : INTEGER; YEAR : INTEGER) : DATESTR;
FUNCTION STORE_DATE (DT : DATESTR) : REAL;
FUNCTION UNSTORE_DATE (DT : REAL) : DATESTR;
Function Month_Str(M : Integer) : MonthStrg;
Function Year_Num(DT : DateStr) : Integer;
Function Month_Num(DT : DateStr) : Integer;
Function Day_Num(DT : DateStr) : Integer;
Function Date_OK(Chk_Date : DateStr) : Boolean;
Implementation
Function Date : DateStr;
Var
MnStr : String [2];
DyStr : String [2];
YrStr : String [4];
MnWrd : word;
DyWrd : word;
YrWrd : word;
WkWrd : word;
Begin
GetDAte(YrWrd,MnWrd,DyWrd,WkWrd);
Str(YrWrd:4,YrStr);
Str(MnWrd:2,MnStr);
If MnStr[1] = ' ' then MnStr[1] := '0';
Str(DyWrd:2,DyStr);
If DyStr[1] = ' ' then DyStr[1] := '0';
Date := MnStr+'/'+DyStr+'/'+YrStr;
End;
CONST
MONTHS : ARRAY[1..12] OF INTEGER = (31,28,31,30,31,30,31,31,30,31,30,31);
FUNCTION DATE_TO_DOY(DT : DATESTR) : INTEGER;
VAR
MONTH,DAY,I,DYS,CODE : INTEGER;
YEAR : REAL;
BEGIN
DYS := 0;
VAL(COPY(DT,1,2),MONTH,CODE);
VAL(COPY(DT,4,2),DAY,CODE);
IF LENGTH(DT) = 8 THEN VAL(COPY(DT,7,2),YEAR,CODE);
IF LENGTH(DT) =10 THEN VAL(COPY(DT,7,4),YEAR,CODE);
FOR I:= 1 TO MONTH-1 DO BEGIN
DYS := DYS + MONTHS[I];
IF (I = 2) AND (FRAC(YEAR/4) = 0) THEN DYS := DYS +1;
END;
DYS := DYS + DAY;
DATE_TO_DOY := DYS;
END;
FUNCTION DOY_TO_DATE (DY : INTEGER; YEAR : INTEGER) : DATESTR;
VAR
I : INTEGER;
MN : STRING[2];
D : STRING[2];
YR : STRING[4];
BEGIN
I := 1;
WHILE DY > MONTHS[I] do BEGIN
DY := DY - MONTHS[I];
IF (I = 2) AND (FRAC(YEAR/4)=0) THEN DY := DY-1;
I := I + 1;
END;
STR(I:2,MN);
IF MN[1] = ' ' THEN MN[1] := '0';
STR(DY:2,D);
IF D[1] = ' ' THEN D[1] := '0';
STR(YEAR:4,YR);
IF YR[1] = ' ' THEN YR[1] := '0';
IF YR[2] = ' ' THEN YR[2] := '0';
DOY_TO_DATE := MN+'/'+D+'/'+YR;
END;
FUNCTION STORE_DATE (DT : DATESTR) : REAL;
VAR
SDT : STRING [10];
YR : REAL;
NUMBER_OF_DAYS : REAL;
I : INTEGER;
BEGIN
IF LENGTH(DT) = 8 THEN SDT := COPY(DATE,7,2)+COPY(DT,7,2);
IF LENGTH(DT) = 10 THEN SDT := COPY(DT,7,4);
VAL(SDT,YR,I);
NUMBER_OF_DAYS := (YR*365.0)+INT(YR/4.0)+DATE_TO_DOY(DT);
STORE_DATE := NUMBER_OF_DAYS;
END;
FUNCTION UNSTORE_DATE (DT : REAL) : DATESTR;
VAR
DAY,YR : INTEGER;
YRR,DRR : REAL;
BEGIN
YRR := INT((DT/365.25));
YR := ROUND(YRR);
DRR := DT-(YRR*365.0)-INT(YRR/4.0);
DAY := ROUND(DRR);
UNSTORE_DATE := DOY_TO_DATE(DAY,YR);
END;
Function Date_OK(Chk_Date : DateStr) : Boolean;
Var
Month : Integer;
Day : Integer;
Year : Integer;
Error : Integer;
Leap_Year : Boolean;
Begin
Val(Copy(Chk_Date,1,2),Month,Error);
If Error = 0 then Val(Copy(Chk_Date,4,2),Day,Error);
If Error = 0 then Val(Copy(Chk_Date,7,4),Year,Error);
Leap_Year :=((Error = 0) AND (Frac(Year/4) = 0));
Date_OK :=
(Error = 0)
AND (Length(Chk_Date) In[8,10])
AND ((Chk_Date[3] In['/','-']) AND (Chk_Date[6] In['/','-']))
AND (Month In[1..12])
AND (((Month IN[4,6,9]) AND (Day IN[1..30]))
OR ((Month IN[1,3,5,7,8,10..12]) AND (Day IN[1..31]))
OR ((Month = 2) AND (Leap_Year) AND (Day IN[1..29]))
OR ((Month = 2) AND (Not Leap_Year) AND (Day IN[1..28])))
End;
Function Short_Date(DT : DateStr) : DateStr;
Begin
Short_Date := Copy(DT,1,6) + Copy(DT,9,2);
End;
Function Month_Num(DT : DateStr) : Integer;
Var
Err,M : Integer;
Begin
Val(Copy(DT,1,2),M,Err);
If Err <> 0 Then
Begin
Write(#7);
Writeln;
WriteLn('Error in date ',DT);
Gotoxy(14+Err,WhereY);
Writeln(#24);
Writeln; Writeln;
Writeln('Must be in form MM/DD/YY or MM/DD/YYYY');
Halt;
End
Else
Month_Num := M;
End;
Function Day_Num(DT : DateStr) : Integer;
Var
Err,D : Integer;
Begin
Val(Copy(DT,4,2),D,Err);
If Err <> 0 Then
Begin
Write(#7);
Writeln;
WriteLn('Error in date ',DT);
Gotoxy(14+Err,WhereY);
Writeln(#24);
Writeln; Writeln;
Writeln('Must be in form MM/DD/YY or MM/DD/YYYY');
Halt;
End
Else
Day_Num := D;
End;
Function Year_Num(DT : DateStr) : Integer;
Var
Err,Y : Integer;
Begin
Val(Copy(DT,7,4),Y,Err);
If Err <> 0 Then
Begin
Write(#7);
Writeln;
WriteLn('Error in date ',DT);
Gotoxy(14+Err,WhereY);
Writeln(#24);
Writeln; Writeln;
Writeln('Must be in form MM/DD/YY or MM/DD/YYYY');
Halt;
End
Else
Year_Num := Y;
End;
Function Month_Str(M : Integer) : MonthStrg;
Type
MonthType = Array[1..12] of MonthStrg;
Const
Mnth : MonthType = ('January','February','March','April','May','June','July',
'August','September','October','November','December');
Begin
Month_Str := Mnth[M];
End;
End.